iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Mobile Development

Android app 效能優化系列 第 21

網路請求的效能優化

  • 分享至 

  • xImage
  •  

App 在要跟後端 API 請求資料的等待時間過久,對使用者來說是很有感的,這篇將介紹如何優化網路請求的效能。

使用成熟的 Open Source 函式庫

在與後端 API 請求資料時,不要自已用較底層的HttpURLConnection。直接使用專門處理 API 的 Open source 函式庫,例如 Retrofit 或是 Apollo,能加快網路請求速度。

Retrofit 實作 API Request

我們就來介紹 Retrofit 這個套件用來跟後端 API 取得料。

首先加入 dependencies

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.squareup.okhttp3:logging-interceptor:4.0.1'

這個範例我們想透過這個 API 網址來取得資料,而回傳的資料如下。

網址:https://jsonplaceholder.typicode.com/todos/1

回傳 Json:

{
	"userId": 1,
	"id": 1,
	"title": "delectus aut autem",
	"completed": false
}

首先針對每一個 Request 建立 interface。

interface ApiService {
    @GET("todos/{id}")
    fun getTodo(@Path("id") id: Int): Call<TodosResponse>
}

建立回傳 Json 的資料模型。

data class TodosResponse(
    val userId: Int,
    val id: Int,
    val title: String,
    val completed: Boolean
)

新增類別 AppClientManager,在這裡實作 Retrofit 的連線功能。

class AppClientManager private constructor() {
    private val retrofit: Retrofit

    init {
        val okHttpClient = OkHttpClient().newBuilder()
            .build()

        retrofit = Retrofit.Builder()
            .baseUrl(Config.URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()
    }

    companion object {
        private val manager = AppClientManager()
        val client: Retrofit
            get() = manager.retrofit
    }
}

接著透過 AppClientManager 去呼叫 getTodo(1) 就可以取得回傳的 TodosResponse 了。

private fun callAPI() {
    val apiService = AppClientManager.client.create(ApiService::class.java)
    apiService.getTodo(1).enqueue(object : Callback<TodosResponse> {
        override fun onResponse(call: Call<TodosResponse>, response: Response<TodosResponse>) {
            println("response:$response")
        }
        override fun onFailure(call: Call<TodosResponse>, t: Throwable) {
            println("onFailure:$t")
        }
    })
}

這樣就完成了透過 Retrofit 請求 API 資源,使用上非常方便,效能也會比自已使用HttpURLConnection來得好。

在 App 建立 Cache

如果網路請求的時間仍是過長,在 App 建立 Cache 也是提升效能的方式,尤其是網路圖片的載入,直接使用像 Glide 這種載入圖片的函式庫,載入速度快且支援 Cache 功能。

從後端伺服器建立 Cache

網路請求的效能問題不見得是 App 的問題,一個網路的請求有可能是慢在後端的資料庫查詢,所以後端 API 如果有 Cache 對於效能也能有所提升。我們在後續會有一篇介紹在處理效能優化處理,你應該懂得尋求協助,不管是向後端或是設計尋求協助,因為效能不只是 App 開發人員的事。

下一篇將接著介紹如何使用 Internet Inspector 來監看網路的使用狀況。


上一篇
使用 Profiler 找出記憶體的異常使用
下一篇
使用 Network Inspector 檢查網路流量
系列文
Android app 效能優化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言